package com.ldzy.webase.controller;

import com.auth0.jwt.JWT;
import com.ldzy.webase.annotation.PassToken;
import com.ldzy.webase.annotation.UserLoginToken;
import com.ldzy.webase.entity.Sports;
import com.ldzy.webase.entity.SportsOrder;
import com.ldzy.webase.entity.SportsTime;
import com.ldzy.webase.entity.User;
import com.ldzy.webase.service.SportsService;
import com.ldzy.webase.utils.Response;
import com.ldzy.webase.utils.ResponseCode;
import com.ldzy.webase.utils.ResponseToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ：Lq
 * @version ：1.0
 * @date ：2022/11/15 17:41
 * @description ：t_sports-场馆预约表-控制层
 */
@RestController
@ResponseBody
@RequestMapping("/sports")
public class SportsController {
    @Autowired
    SportsService sportsService;

    /**
     * @author ：Lq
     * @date ：2022/11/15 17:42
     * @description ：查询所有场馆信息，可根据场馆类型查询
     */
    @GetMapping("/list")
    @PassToken
    public Response getAllSports(@RequestParam(value = "type", required = false) String type) {
        System.out.println("type：" + type);
        List<Sports> sportsList = sportsService.getAllSports(type);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, sportsList);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/15 17:48
     * @description ：根据场馆id获取场馆详情信息-包括预约的时间段 预约时间-开始 至 预约时间-结束
     */
    @GetMapping("/sports")
    @PassToken
    public Response getSportsBySportsId(@RequestParam("sportsId") Integer sportsId,
                                        @RequestParam(value = "orderDate", required = false) Date orderDate) {
        Sports sports = sportsService.getSportsBySportsId(sportsId); // 查询场馆详细信息
        List<SportsTime> sportsTimeList = sportsService.getSportsStartEndDateBySportsId(sportsId, orderDate); // 查询场馆的预约时间段

        Map<String, Object> map = new HashMap<>();
        // 封装场馆详情信息
        map.put("sports", sports);
        // 封装场馆预约的时间段
        map.put("sportsTime", sportsTimeList);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, map);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/23 14:14
     * @description ：根据学生uid和场馆sportsId添加预约记录信息
     */
    @PostMapping("/sportsOrder")
    @UserLoginToken
    public Response addSportsOrder(@RequestBody SportsOrder sportsOrder, HttpServletRequest request) {
        System.out.println("sportsOrder:" + sportsOrder);

        // 从请求头中取出token
        String token = request.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));


        // 将 token 中的uid存入
        sportsOrder.setUid(uid);
        // 添加用户预约信息
        sportsService.addSportsOrder(sportsOrder);

        // 返回成功给前端
        return Response.build(ResponseCode.SUCCESS);
    }

    /**
     * @author ：Lq
     * @date ：2022/12/3 11:02
     * @description ：根据学生uid查询已预约的记录信息
     */
    @GetMapping("/sportsOrder/user")
    @UserLoginToken
    public Response getSportsOrderByUid( HttpServletRequest request) {
        // 从请求头中取出token
        String token = request.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 获取用户预约信息
        List<SportsOrder> sportsList = sportsService.getSportsOrderByUid(uid);

        // 返回 数据 给前端
        return Response.build(ResponseCode.SUCCESS,sportsList);
    }
}